/**
 * IPC通信模块
 * 提供统一的IPC消息发送和接收接口
 */

const { ipcRenderer } = require('electron');
const { handleError, ErrorTypes, tryCatch } = require('./error-handler');

/**
 * 发送IPC消息并等待响应
 * @param {string} channel - IPC通道名称
 * @param {...any} args - 传递给主进程的参数
 * @returns {Promise<any>} - 主进程返回的结果
 */
async function sendIpcMessage(channel, ...args) {
    return tryCatch(
        async () => {
            return await ipcRenderer.invoke(channel, ...args);
        },
        {
            errorType: ErrorTypes.SYSTEM,
            context: { action: `发送IPC消息: ${channel}` },
            onError: (error) => {
                console.error(`发送IPC消息失败 [${channel}]:`, error);
                throw error; // 重新抛出错误，让调用者处理
            }
        }
    );
}

/**
 * 发送单向IPC消息（不等待响应）
 * @param {string} channel - IPC通道名称
 * @param {...any} args - 传递给主进程的参数
 */
function sendOneWayIpcMessage(channel, ...args) {
    tryCatch(
        () => {
            ipcRenderer.send(channel, ...args);
        },
        {
            errorType: ErrorTypes.SYSTEM,
            context: { action: `发送单向IPC消息: ${channel}` },
            onError: (error) => console.error(`发送单向IPC消息失败 [${channel}]:`, error)
        }
    );
}

/**
 * 监听IPC消息
 * @param {string} channel - IPC通道名称
 * @param {Function} listener - 消息处理函数
 * @returns {Function} - 用于移除监听器的函数
 */
function listenToIpcMessage(channel, listener) {
    const wrappedListener = (event, ...args) => {
        tryCatch(
            () => {
                listener(event, ...args);
            },
            {
                errorType: ErrorTypes.APPLICATION,
                context: { action: `处理IPC消息: ${channel}` },
                onError: (error) => console.error(`处理IPC消息失败 [${channel}]:`, error)
            }
        );
    };
    
    ipcRenderer.on(channel, wrappedListener);
    
    // 返回一个函数，用于移除监听器
    return () => {
        ipcRenderer.removeListener(channel, wrappedListener);
    };
}

/**
 * 移除特定通道的所有监听器
 * @param {string} channel - IPC通道名称
 */
function removeAllListeners(channel) {
    ipcRenderer.removeAllListeners(channel);
}

module.exports = {
    sendIpcMessage,
    sendOneWayIpcMessage,
    listenToIpcMessage,
    removeAllListeners
};